//: [Previous](@previous)

/*:
 ### leetcode上第349号问题：Intersection of Two Arrays
 https://leetcode.com/problems/intersection-of-two-arrays/submissions/
 ```
 给定两个数组，编写一个函数来计算它们的交集。
 示例 1:
 输入: nums1 = [1,2,2,1], nums2 = [2,2]
 输出: [2]
 示例 2:
 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
 输出: [9,4]
 说明:
 输出结果中的每个元素一定是唯一的。
 我们可以不考虑输出结果的顺序。
 ```
 */

var nums1 = [1,2,2,1], nums2 = [2,2]

// 使用 set 去重
// 时间复杂度 O(n)
// 空间复杂度 O(n)
func Solution(_ nums1: [Int], _ nums2: [Int]) -> [Int] {
    let setnum = Set(nums1)
    let setnum2 = Set(nums2)
//    var result = [Int]()
//    for num in setnum {
//        if nums2.contains(num) {
//            result.append(num)
//        }
//    }
//
    return Array(setnum.intersection(setnum2))
}

print("1.1 \(Solution(nums1, nums2))")

nums1 = [4,9,5]
nums2 = [9,4,9,8,4]
print("1.2 \(Solution(nums1, nums2))")

/*:
 ### leetcode上第350号问题：Intersection of Two Arrays II
 https://leetcode.com/problems/intersection-of-two-arrays-ii/description/
 ```
 给定两个数组，编写一个函数来计算它们的交集。
 示例 1:
 输入: nums1 = [1,2,2,1], nums2 = [2,2]
 输出: [2,2]
 示例 2:
 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
 输出: [4,9]
 说明：
 输出结果中每个元素出现的次数，应与元素在两个数组中出现的次数一致。
 我们可以不考虑输出结果的顺序。
 ```
 */

// map使用 100%
// 时间复杂度 O(n)
// 空间复杂度 O(n)
func Solution2(_ nums1: [Int], _ nums2: [Int]) -> [Int] {
    var mapnum = [Int: Int]()
    var result = [Int]()
    for num in nums1 {
        if let value = mapnum[num] {
            mapnum[num] = value + 1
        } else {
            mapnum[num] = 1
        }
    }
    
    for num in nums2 {
        if let value = mapnum[num], value > 0 {
            result.append(num)
            mapnum[num] = value - 1
        }
    }
    
    return result
}

nums1 = [1,2,2,1]
nums2 = [2,2]
print("2.1. \(Solution2(nums1, nums2))")

nums1 = [4,9,5]
nums2 = [9,4,9,8,4]
print("2.2. \(Solution2(nums1, nums2))")

//: [Next](@next)
